package cn.ipenta.blockchain;

/**
 * @author ipenta
 * @ClassName: BlockChainClient
 * @Description: TODO
 * @date 2017-09-28 下午2:56
 */

import cn.ipenta.blockchain.entity.*;
import org.springframework.scheduling.annotation.Async;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public interface BlockChainClient {

	/** 公钥&私钥 **/

	// 创建公私钥对
	Message<Map<String, String>> generateKey();

	// 签名
	Message<String> sign(String txType, Map<String, String> data, Long timestamp, String privKey);

	// 签名（版本更新）
	Message<String> sign2(String txType, Map<String, String> data, Long timestamp, String referToTxHash,
						  List<String> authorizedUpdaters, String privKey);

	/** 存证类型管理 **/

	// 添加存证类型
	Message<Boolean> addTxType(RecordTypeInfo recordType, String pubKey);

	// 查询所有存证类型
	Message<List<RecordTypeInfo>> getAllTxTypes();

	/** 存证 **/

	// 存证接口(单条)
	// 接收单条存证数据，构造区块链消息，广播到区块链。返回存证合约哈希。
	Message<String> archive(String txType, Map<String, String> data, Long timestamp, String pubKey, String sig);

	// 存证接口(带版本更新)
	Message<String> archive2(String txType, Map<String, String> data, Long timestamp, String pubKey, String sig,
							 String referToTxHash, List<String> authorizedUpdaters);

	// 存证状态查询
	Message<Boolean> isConfirmed(String txHash);

	/** 查询服务 **/

	// 查询当前区块高度
	Message<Long> lookupBlockHeight();

	// 按区块高度查询账簿
	Message<BlockInfo> lookupBlockByHeight(long blockHeight);

	// 按区块高度查询区块概要信息
	Message<BlockOverviewInfo> lookupBlockOverviewByHeight(Long blockHeight);

	// 按区块高度批量查询账簿
	Message<List<BlockInfo>> lookupBlockListByHeight(long blockHeightStart, long blockHeightEnd);

	// 按区块封装时间查询账簿
	Message<List<BlockInfo>> lookupBlockByTimestamp(long timestampStart, long timestampEnd);

	// 按区块哈希查询账簿
	Message<BlockInfo> lookupBlockByHash(String blockHash);

	// 按交易哈希查询账簿
	@Async
	Message<TransactionInfo> lookupTxByHash(String txHash);

	// 按交易预定义查询字段查询账簿
	@Async
	Message<List<TransactionInfo>> lookupTxByKey(String txType, Map<String, String> filter);

	// 按区块高度批量查询区块概要信息
	Message<List<BlockOverviewInfo>> lookupBlockOverviewListByHeight(Long blockHeightStart, Long blockHeightEnd);

	// 按区块封装时间查询区块概要信息
	Message<List<BlockOverviewInfo>> lookupBlockOverviewByTimestamp(Long timestampStart, Long timestampEnd);

	// 按区块哈希查询区块概要信息
	Message<BlockOverviewInfo> lookupBlockOverviewByHash(String blockHash);

	// 获取最新区块概要信息
	Message<List<BlockOverviewInfo>> lookupBlockOverviewTop(Long topNum);

	// 根据公钥获取交易列表
	Message<List<TransactionInfo>> lookupTxByPublicKey(String publicKey);

	// 按分页获取区块信息
	Message<List<BlockInfo>> lookupBlockGroup(Long currentPageIndex, Long pageDataCount, Integer sortType);

	// 按分页获取区块概要信息
	Message<List<BlockOverviewInfo>> lookupBlockOverviewGroup(Long currentPageIndex, Long pageDataCount,
															  Integer sortType);

	// 按分页获取交易数据
	Message<TreeMap<String, TransactionInfo>> lookupTxGroup(String prevID, long blockHeightEnd, Integer sortType);
}
